package com.test.spring.master;

import org.aspectj.lang.JoinPoint;

public class DataSourceAspect {
	
	/**
	 * 进入service方法之前
	 */
	public void before2(JoinPoint point) {
		String methodName = point.getSignature().getName();
		if (isSlave(methodName)) {
			//走写库
			DynamicDataSourceHolder.markMaster();
		}else {
			//走读库
			DynamicDataSourceHolder.markSlave();
		}
	}
	
	/**
	 * 判断是否为读库
	 */
    private Boolean isSlave(String methodName) {  
        // 方法名以query、find、get开头的方法名走从库 
    	boolean flag = true;
    	
    	if (methodName.contains("query")||
    		methodName.contains("find") ||
    		methodName.contains("get")) {
    		flag = false;
		}
    	return flag;
    }
	
	
/*	private List<String> slaveMethodPattern = new ArrayList<>();
	private static final String[] defaultSlaveMethodStart = new String[]{ "query", "find", "get" };
	private String[] slaveMethodStart;
	
	*//**
	 * 读取事务管理中的策略
	 *//*
	public void setTxAdvice(TransactionInterceptor txAdvice) throws Exception{
		if (txAdvice == null) {
			//没有配置事务管理策略
			return;
		}
		
		//从txAdvice获取到策略配置信息
		TransactionAttributeSource transactionAttributeSource = txAdvice.getTransactionAttributeSource();
		if (!(transactionAttributeSource instanceof NameMatchTransactionAttributeSource)) {
			return;
		}
		
        //使用反射技术获取到NameMatchTransactionAttributeSource对象中的nameMap属性值  
        NameMatchTransactionAttributeSource matchTransactionAttributeSource = (NameMatchTransactionAttributeSource) transactionAttributeSource;  
        Field nameMapField = ReflectionUtils.findField(NameMatchTransactionAttributeSource.class, "nameMap");  
        nameMapField.setAccessible(true); //设置该字段可访问  
        //获取nameMap的值  
        Map<String, TransactionAttribute> map = (Map<String, TransactionAttribute>) nameMapField.get(matchTransactionAttributeSource);  
  
        //遍历nameMap  
        for (Map.Entry<String, TransactionAttribute> entry : map.entrySet()) {  
            if (!entry.getValue().isReadOnly()) {//判断之后定义了ReadOnly的策略才加入到slaveMethodPattern  
                continue;  
            }  
            slaveMethodPattern.add(entry.getKey());  
        }  
        
	}
	
	
    *//** 
     * 在进入Service方法之前执行 
     *  
     * @param point 切面对象 
     *//*  
    public void before(JoinPoint point) {  
        // 获取到当前执行的方法名  
        String methodName = point.getSignature().getName();
        
        boolean isSlave = false;
        
        if (slaveMethodPattern.isEmpty()) {
            // 当前Spring容器中没有配置事务策略，采用方法名匹配方式  
            isSlave = isSlave(methodName);
		}else
		{
			//使用策略规则匹配
			for (String mappedName : slaveMethodPattern) {
                if (isMatch(methodName, mappedName)) {  
                    isSlave = true;  
                    break;  
                }
				
				
			}
			
		}
        
        if (isSlave(methodName)) {  
            // 标记为读库  
            DynamicDataSourceHolder.markSlave();  
        } else {  
            // 标记为写库  
            DynamicDataSourceHolder.markMaster();  
        }  
    } 
	
    *//** 
     * 判断是否为读库 
     *  
     * @param methodName 
     * @return 
     *//*  
    private Boolean isSlave(String methodName) {  
        // 方法名以query、find、get开头的方法名走从库 
    	
    	boolean flag = false;
    	
    	if (methodName.contains("query")||
    		methodName.contains("find") ||
    		methodName.contains("get")) {
    		flag = true;
		}
    	return flag;
    }
    
    *//**
     * 通配符匹配
     *//*
    protected boolean isMatch(String methodName, String mappedName) {  
        return PatternMatchUtils.simpleMatch(mappedName, methodName);  
    } 
    
    *//** 
     * 用户指定slave的方法名前缀 
     * @param slaveMethodStart 
     *//*  
    public void setSlaveMethodStart(String[] slaveMethodStart) {  
        this.slaveMethodStart = slaveMethodStart;  
    }  
  
    public String[] getSlaveMethodStart() {  
        if(this.slaveMethodStart == null){  
            // 没有指定，使用默认  
            return defaultSlaveMethodStart;  
        }  
        return slaveMethodStart;  
    }*/
    
    
}
